/*

  The contents of this file are subject to the Mozilla Public License Version
  1.1 (the "License"); you may not use this file except in compliance with
  the License. You may obtain a copy of the License at 
  
           http://www.mozilla.org/MPL/ 
  
  Software distributed under the License is distributed on an "AS IS" basis,
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  for the specific language governing rights and limitations under the License. 
  
  The Original Code is Indigo framework applicatif.
  
  The Initial Developer of the Original Code is
  Olivier Bugalotto (aka Iteratif) <olivier.bugalotto@iteratif.net>.
  Portions created by the Initial Developer are Copyright (C) 2004-2008
  the Initial Developer. All Rights Reserved.
  
  Contributor(s) :
  
*/
package indigo.config
{
	/**
	 * La classe <code>ObjectDefinition</code> est une definition d'un objet
	 * enregistree dans le dictionnaire <code>ObjectDefinitionRegistry</code>.
	 * 
	 * @example Creation en actionscript d'une definition d'objet:
	 * <listing version="3.0">
	 * <b>var</b> properties:Array = [<b>new</b> Property(<i>"source"</i>,<i>"HelloWorld"</i>),
	 * 						   <b>new</b> Property(<i>"destination"</i>,<i>"amfphp"</i>),
	 * 						   new Property("endpoint","http://www.monserver.com/amfphp/gateway.php")];
	 * <b>var</b> definition:IObjectDefinition = <b>new</b> ObjectDefinition(<b>getQualifiedClassName</b>(mx.rpc.remoting.mxml.RemoteObject),
	 * 														   true,properties);
	 * <b>var</b> registry:IObjectDefinitionRegistry = <b>new</b> ObjectDefinitionRegistry();
	 * registry.registerDefinition(<i>"remote"</i>,definition);
	 * </listing>
	 * 
	 * @see indigo.register.ObjectDefinitionRegistry
	 * @see IObjectDefinition
	 * @see Property
	 */
	public class ObjectDefinition implements IObjectDefinition
	{
		private var _className:String;
		private var _singleton:Boolean;
		// private var _dependencies:Array;
		private var _properties:Array;
		private var _initMethod:String;
		private var _lazyInit:Boolean;
		
		/**
		 * Obtenir le nom qualifie de la classe
		 * 
		 * @return <code>String</code>	Nom qualifie de la classe 
		 * 
		 * <p>
		 * Ce nom est utilise par la methode <code>getDefinitionByName()</code>
		 * pour obtenir la definition de classe et ainsi pouvoir le creer:
		 * <pre>
		 * <b>var</b> DefClass:<b>Class</b> = <b>getDefinitionByName</b>(<i>"org.iteratif.MaClass"</i>) <b>as Class</b>;
		 * <b>var</b> instance:<b>Object</b> = <b>new</b> DefClass();
		 * </pre>
		 * </p>
		 */
		public function get className():String {
			return _className;
		}
		
		/* public function get dependencies():Array {
			return _dependencies;
		} */
		
		/**
		 * Obtenir un tableau d'objets <code>Property</code>
		 * definissant les valeurs a affecter a l'objet au moment de sa creation. 
		 * @return Reference d'un tableau d'objets <code>Property</code>
		 * 
		 */
		public function get properties():Array {
			return _properties;
		}
		
		/**
		 * Permet de savoir si un objet est un objet unique (Singleton) 
		 * @return
		 * 
		 */
		public function get isSingleton():Boolean {
			return _singleton;
		}
		
		/**
		 *  
		 * @return 
		 * 
		 */
		public function get lazyInit():Boolean {
			return _lazyInit;
		}
		
		/**
		 * Obtenir le nom de la methode d'initalisation qui sera appelee
		 * au moment de la creation d'un objet du referentiel. 
		 * @return
		 * 
		 */
		public function get initMethod():String {
			return _initMethod;
		}
		
		public function set initMethod(value:String):void {
			_initMethod = value;
		}
		
		/**
		 * Creer un nouvel objet <code>ObjectDefinition</code> qui contient
		 * tout le necessaire pour que la fabrique IOC puisse le creer.
		 * Cette definition est stockee dans le referentiel <code>ObjectDefinitionRegistry</code>.
		 * 
		 * <p>
		 * Si vous utilisez un descripteur de configuration XML, vous n'aurez jamais
		 * besoin de vous en servir directement, ceci incombera a la classe <code>ObjectDefinitionDescriptor</code>.
		 * </p>
		 * 
		 * @param className		<String>	Le nom qualifie de la classe a creer.
		 * @param singleton		<Boolean>	Objet unique.
		 * @param properties	<Array>		Tableau d'objets <code>Property</code>.
		 * @param initMethod	<String>	Nom de la methode d'initialisation.
		 * 
		 * @see indigo.register.ObjectDefinitionRegistry
		 */
		public function ObjectDefinition(className:String, singleton:Boolean = true, properties:Array = null, lazyInit:Boolean = false) //, dependencies:Array = null)
		{
			_className = className;
			_singleton = singleton;
			_properties = properties;
			_lazyInit = lazyInit;
			// _dependencies = dependencies;
		}

		public function initialize(initiator:IInitiator):void {
			for each(var property:IProperty in properties) {
				property.initialize(initiator);
			}
		}
	}
}